package net.capstone.cra.smartcontroller.util;

/**
 * The Class ByteConverter.
 */
public class ByteConverter {

	/**
	 * Int2byte.
	 * integer type convert to byte type
	 * 
	 * @param i the i
	 * @return the byte[]
	 */
	public static byte[] int2byte(int i) {
		byte[] array = new byte[4];
		array[3] = (byte) (i & 0xff);
		array[2] = (byte) ((i >> 8) & 0xff);
		array[1] = (byte) ((i >> 16) & 0xff);
		array[0] = (byte) ((i >> 24) & 0xff);

		return array;
	}

	/**
	 * Byte2int.
	 * byte type convert to integer type.
	 *
	 * @param bytes the bytes
	 * @param start the start
	 * @return the int
	 */
	public static int byte2int(byte[] bytes, int start) {
		int newValue = 0;
	
		newValue |= (((int) bytes[start + 0]) << 24) & 0xFF000000;
		newValue |= (((int) bytes[start + 1]) << 16) & 0xFF0000;
		newValue |= (((int) bytes[start + 2]) << 8) & 0xFF00;
		newValue |= (((int) bytes[start + 3])) & 0xFF;
	
		return newValue;
	}

	/**
	 * Float2bytes.
	 * float type convert to byte type. 
	 *
	 * @param value the value
	 * @return the byte[]
	 */
	public static byte[] float2bytes(float value) {
	
		byte[] array = new byte[4];
		int intBits = Float.floatToIntBits(value);
	
		array[0] = (byte) ((intBits & 0x000000ff) >> 0);
		array[1] = (byte) ((intBits & 0x0000ff00) >> 8);
		array[2] = (byte) ((intBits & 0x00ff0000) >> 16);
		array[3] = (byte) ((intBits & 0xff000000) >> 24);
	
		return array;
	}

	/**
	 * Byte2float.
	 * byte type convert to float type
	 *
	 * @param arr the arr
	 * @param start the start
	 * @return the float
	 */
	public static float byte2float(byte[] arr, int start) {
		int i = 0;
		int len = 4;
		int cnt = 0;
		byte[] tmp = new byte[len];
	
		for (i = start; i < (start + len); i++) {
			tmp[cnt] = arr[i];
			cnt++;
		}
	
		int accum = 0;
		i = 0;
		for (int shiftBy = 0; shiftBy < 32; shiftBy += 8) {
			accum |= ((long) (tmp[i] & 0xff)) << shiftBy;
			i++;
		}
		return Float.intBitsToFloat(accum);
	}
}